//用户数据模块

import { defineStore } from 'pinia';
//请求函数
import { reqLogin, reqUserInfo, reqLogout } from "@/api/user/index.ts";
//引入相关的数据类型
import type { loginFormData, loginResponseData, userInfoResponseData } from "@/api/user/type";
//引入路由相关配置
//@ts-ignore,引入路由文件中的常量、权限路由、任意路由配置
import { anyRouter, constantRouter, permissionRouter } from "@/router/index.ts";

//引入router实例,用于动态添加路由表
import router from "@/router/index.ts";

//@ts-ignore,引入lodash深拷贝方法
import { cloneDeep } from "lodash";

//功能函数筛选出当前用户的动态路由,返回值[]
//问题:当一个权限少的用户登录后，admin账户再登录（没有进行刷新）此时用户正常的权限就没有了，问题在于，permissionRouter引用赋值，应当进行深拷贝。
let clonePermissionRouter = cloneDeep(permissionRouter);
function filterRouters(permissionRouter:any, Userroutes:any){
    let asyncRoutes = permissionRouter.filter(item => {
        if(item.children && item.children.length > 0){
            item.children = filterRouters(item.children, Userroutes);
        }
        return (Userroutes.findIndex(ele => ele.toLowerCase() == item.name.toLowerCase())) !== -1;
    })
    //服务器返回数据不准,此处手动添加一个权限管理中的菜单权限
    asyncRoutes.forEach(item => {
        if(item.name == 'Permission' && item.children.length !== 0){
            //追加菜单权限
            item.children.push(
                {
                    name:"Menu",
                    path:"/permission/menu",
                    component:()=>import('@/view/permission/menu/index.vue'),
                    meta:{title:"菜单管理",hidden:false,icon:"Grid"}
                }
            )
        }
    })
    return asyncRoutes;
}


let useUserStore = defineStore("user",{
    state:() => {
        return {
            token:localStorage.getItem('token') || '',  //用户唯一标识
            dynamicRouter:constantRouter,  //根据用户信息所生成的路由信息，给导航栏使用，目前是从路由表引来的静态路由
            userInfo:{},  //存储当前用户的信息,包含路由权限及按钮权限
            username:''
        }
    },
    actions:{
        //用户登录
        async userLogin(data:loginFormData){
            let res:loginResponseData = await reqLogin(data);
            if(res.code === 200){
                //登录成功
                this.token = res.data;
                localStorage.setItem('token',res.data);
                // console.log("用户登录api成功!",res);            
                return 'ok';
            }else{
                // console.log("用户登录api失败!");              
                return Promise.reject(new Error('faile'));
            }
        },
        //用户登录后获取用户信息
        async getUserInfo(){
            let res:userInfoResponseData = await reqUserInfo();
            if(res.code == 200){
                this.userInfo = res.data;
                this.username = res.data.name;  //重复赋值，当作观察服务器数据有没有回来的标志
                //生成当前用户的动态路由。(对permissionRouter进行拷贝后再给其传递参数)
                let routeList = filterRouters(clonePermissionRouter,res.data.routes);
                this.dynamicRouter = [...constantRouter,...routeList];  //供菜单栏使用
                //动态追加路由表给router实例
                [...routeList,...anyRouter].forEach(item => {
                    router.addRoute(item);  //追加路由
                })
                // console.log("用户信息api获取成功",res);
            }else{
                // console.log("用户信息api获取失败",res);
            }
        },
        //用户退出登录
        async userLogout(){
            let res:any = await reqLogout();
            if(res.code == 200){ 
                this.token = "";
                this.userInfo = {};
                localStorage.removeItem('token');
                // console.log("退出登录api成功");
                return 'ok';
            }
        }
    },
    getters:{

    }
})


export default useUserStore;